package com.vates.gestion.dao.impl;

import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.vates.entidades.Reserva;
import com.vates.gestion.dao.BaseDAOReserva;

@Repository(value = "ReservaDAO")
public class ReservaDAOImpl implements BaseDAOReserva<Reserva> {

	private EntityManager em;

	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.em = em;
	}

	@Override
	@Transactional(readOnly = true)
	@SuppressWarnings("unchecked")
	public List<Reserva> buscarPorIdHotelYfecha(int idHotel, Date inicio,
			Date fin) {
		List<Reserva> listaReservas = em
				.createQuery(
						"SELECT r FROM Reserva r join r.id_tipoHabitacion t join t.id_Hotel h WHERE h.id_Hotel = :idHotel "
								+ "AND  ((r.fecha_inicio BETWEEN :inicio AND :fin) OR (r.fecha_fin BETWEEN :inicio AND :fin) "
								+ "OR (r.fecha_inicio <= :inicio AND r.fecha_fin >= :fin ))")
				.setParameter("idHotel", idHotel)
				.setParameter("inicio", inicio).setParameter("fin", fin)
				.getResultList();
		System.out.println(listaReservas.size());
		return listaReservas;
	}

	@Override
	@Transactional(readOnly = true)
	@SuppressWarnings("unchecked")
	public List<Reserva> buscarPorIdClienteYfecha(int idCliente, Date inicio,
			Date fin) {
		List<Reserva> listaReservas = em
				.createQuery(
						"SELECT r FROM Reserva r join r.id_cliente c WHERE c.id_cliente = :idCliente "
								+ "AND  ((r.fecha_inicio BETWEEN :inicio AND :fin) OR (r.fecha_fin BETWEEN :inicio AND :fin ) "
								+ "OR (r.fecha_inicio <= :inicio AND r.fecha_fin >= :fin ))")
				.setParameter("idCliente", idCliente)
				.setParameter("inicio", inicio).setParameter("fin", fin)
				.getResultList();
		;

		return listaReservas;
	}

	@Override
	@Transactional(readOnly = true)
	public Reserva buscarPorId(int id) {
		Reserva reserva = em.find(Reserva.class, id);
		return reserva;
	}

	@Override
	@Transactional(readOnly = false)
	public Reserva nuevo(Reserva entidad) {
		Reserva r = em.merge(entidad);
		System.out.println("Agregada la reserva " + entidad.getId_reserva());
		return r;
	}

	@Override
	@Transactional(readOnly = false)
	public void eliminar(int id) {
		Reserva r = em.find(Reserva.class, id);
		em.remove(r);
		System.out.println("Eliminada la reserva num " + id);
	}

	@Override
	@Transactional(readOnly = false)
	public void modificar(Reserva entidad) {
		Reserva reserva = new Reserva();
		if (entidad.getId_reserva() != 0) {
			em.merge(reserva);
		} else {
			em.persist(reserva);
		}
	}

	@Override
	@Transactional(readOnly = true)
	@SuppressWarnings("unchecked")
	public List<Reserva> buscarTodos() {
		List<Reserva> listaReservas = em
				.createQuery("SELECT r FROM  Reserva r").getResultList();
		return listaReservas;
	}

}
